package com.witsight.platform.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import com.witsight.platform.exception.BusinessException;
import com.witsight.platform.model.BoEntity;

/**   
 * 说明：基础服务类接口 所有的数据库类型服务的基础
 * 需要关注事物管理
 * {@link TxAdviceInterceptor.TX_METHOD_NAMES} 查看规则
 * @Title: BaseGenericService.java 
 * @Package com.witsight.platform.service 
 * @See: {@link BaseGenericService}
 * Copyright: Copyright (c) 2017
 * Company:sany huax witsight team by product
 * @author: penght  
 * @date: 2017年9月18日 下午5:59:02 
 * @version: V1.0
 *
 */
public interface BaseGenericService<T, ID extends Serializable, M> extends CommonService{
	/**
	 * 
	 * 说明：通过id获取对应实体的引用
	 * 
	 * @Title: getOne
	 * @See: EntityManager#getReference(Class, Object)
	 * @author penght
	 * @param id
	 * @return a reference to the entity with the given identifier.
	 * @throws BusinessException
	 * @date: 2015年4月22日 下午8:36:54
	 */
	T findOne(ID id) throws BusinessException;
	/**
	 * 
	 * 说明：查找所有的数据
	 * 
	 * @Title: findAll
	 * @See: {@link #findAll()}
	 * @author penght
	 * @return
	 * @throws BusinessException
	 * @date: 2015年4月22日 下午8:38:48
	 */
	List<T> findAll() throws BusinessException;
	/**
	 * Returns whether an entity with the given id exists.
	 * 
	 * @param id must not be {@literal null}.
	 * @return true if an entity with the given id exists, {@literal false} otherwise
	 * @throws IllegalArgumentException if {@code id} is {@literal null}
	 */
	boolean exists(ID id);
	
	/**
	 * 
	 * 说明:根据map参数取得所有数据
	 * 
	 * @Title: findAllByQuery
	 * @See: {@link #findAllByParams(String, Map)}
	 * @author penght
	 * @param namequery
	 *            namequery中配置的key
	 * @param params
	 *            检索条件map对象
	 * @return 全部数据
	 * @date: 2015年4月22日 下午2:56:13
	 */
	List<T> findAllByParams(String queryName, BoEntity params);
	
	/**
	 * 
	 * 说明：根据map参数取得所有BoEntity数据 (Hql)
	 * @Title: findBoEntitysByParams
	 * @See: {@link #findBoEntitysByParams(String, BoEntity)}
	 * @author penght
	 * @param queryName namequery中配置的key
	 * @param params 检索条件map对象
	 * @return 所有BoEntity数据
	 * @date: 2017年9月18日 下午2:37:28
	 */
	List<M> findBoEntitysByParams(String queryName, BoEntity params);
	
	/**
	 * 
	 * 说明：根据map参数取得一条数据
	 * @Title: findOneByParams
	 * @See: {@link #findOneByParams(String, Map)}
	 * @author penght
	 * @param queryName  namequery中配置的key
	 * @param mapObject 检索条件map对象
	 * @return 一条数据
	 * @date: 2017年9月15日 上午10:25:38
	 */
	T findOneByParams(String queryName, BoEntity params);
	/**
	 * 
	 * 说明：根据map参数取得一条BoEntity数据 (Hql)
	 * @Title: findBoEntitysByParams
	 * @See: {@link #findBoEntitysByParams(String, BoEntity)}
	 * @author penght
	 * @param queryName namequery中配置的key
	 * @param params 检索条件map对象
	 * @return 一条BoEntity数据
	 * @date: 2017年9月18日 下午2:37:28
	 */
	M findBoEntityByParams(String queryName, BoEntity params);
	/**
	 * 
	 * 说明：根据翻页取得所有的对象，通过动态hql
	 * @Title: findPageByParams
	 * @See: {@link #findPageByParams(String, Map, Pageable)}
	 * @author penght
	 * @param queryName namequery中配置的key
	 * @param mapObject 检索条件map对象
	 * @param pageable 翻页参数
	 * @return 翻页结果集合
	 * @date: 2017年9月15日 上午10:25:47
	 */
	Page<T> findPageByParams(String queryName, BoEntity params, Pageable pageable);
	
	/**
	 * 
	 * 说明：根据翻页取得所有的对象，通过动态hql
	 * @Title: findPageByParams
	 * @See: {@link #findPageByParams(String, Map, Pageable)}
	 * @author penght
	 * @param queryName namequery中配置的key
	 * @param mapObject 检索条件map对象
	 * @param pageable 翻页参数
	 * @return 翻页结果集合
	 * @date: 2017年9月15日 上午10:25:47
	 */
	Page<M> findPageBoEntityByParams(String queryName, BoEntity params, Pageable pageable);
}
